package hibernate.web;

import hibernate.fileControler.CheckFileHash;
import hibernate.fileControler.DeleteFiles;
import hibernate.fileControler.ListFiles;
import hibernate.fileControler.MyException;
import hibernate.fileControler.UploadFiles;
import hibernate.model.Resimler;
import hibernate.service.EmmyService;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@SuppressWarnings("serial")
@Component("ResimlerBean")
@Scope("session")
public class ResimlerBean implements BeanService {

	@Autowired
	private transient EmmyService emmyService;
	
	private Resimler selectedResim;	
	private List<Resimler> resimList;
	private ArrayList<Resimler> selectedAygitResimList = new ArrayList<Resimler>();
	
	private ArrayList<UploadedFile> fileList = new ArrayList<UploadedFile>();
	private UploadedFile removeFile;
	private AygitBean agtBean;
	public String newFileDirectory = "C:/Users/HAVANE/workspace-indigo/yeniEMMY/WebContent/";
	private String dest = "productImages/";
	
	@Override
	@PostConstruct
	public void init() {
		//resimList = (List<Resimler>) emmyService.findAll(new Resimler());
	}

	@Override
	public String restart() {
		init();
		return "list";
	}

	@Override
	public String deleteView() {
		DeleteFiles.deleteFiles(selectedResim.getResimKonum(),newFileDirectory);
		emmyService.delete(selectedResim);
		return "";
	}

	@Override
	public String viewNew() {
		selectedResim= new Resimler();
		return "detail";
	}

	@Override
	public String viewDetail() {/*
		List<Resimler> valueList = (List<Resimler>) resimTable.getValue();	
		System.out.println("table size : "+valueList.size());		
		Iterator<SimpleRowKey> keys = resimTable.getSelection().getKeys();
		
		if(keys.hasNext()){
			currentResim= valueList.get(keys.next().intValue());
			System.out.println("dolu = "+currentResim.getResimid());
			return "detail";
		}else{
			System.out.println("bo�ta");
			return null;
		}*/ return"detay";
	}

	@Override
	public String SaveOrUpdate() throws MyException {
		String temp = dest;
		agtBean = (AygitBean) emmyService.getBean(new AygitBean());
		dest = dest+agtBean.getSelectedAygitObject().getClass().getSimpleName();
		int i =0;
		try{
			if(uploadControl()){
				for(i=0; i<fileList.size(); i++){ // Yukarıda hata çıkmazsa dosyalar kaydedilecek		
					UploadFiles.saveFile(fileList.get(i), dest);
					System.out.println("i : "+i);
					
				}
				dest =temp;
				return "OK";
			}else return "";
			
		}catch(MyException mye){
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Unsuccesful", fileList.get(i).getFileName() +" : "+ mye.getMessage());  
			FacesContext.getCurrentInstance().addMessage(null, msg);
			cancelFileUpload();
			return "";
		}		
		catch(Exception e){
			System.out.println("uploadControl exp: "+e);
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Unsuccesful", fileList.get(i).getFileName() +" : "+ e.getMessage());  
			FacesContext.getCurrentInstance().addMessage(null, msg);
			cancelFileUpload();
			return "";
		}
	}
	
	@SuppressWarnings("unchecked")
	public void getSelectedAygitResimleri(long id){ 
		System.out.println("aygit resimleri arrayList giriş");		
		selectedAygitResimList = (ArrayList<Resimler>) emmyService.getQuery("findResAygitid", "rAygitid", id);
		System.out.println("size : "+selectedAygitResimList.size());
		System.out.println("aygit resimleri arrayList çıkış");
	}
	
	public void deleteFileToList(){
		System.out.println("deletedeyim");
		fileList.remove(removeFile);
	}
	
	public void deleteAygitFile(Resimler resim){
		selectedResim = resim;
		//selectedResim = (Resimler) ( emmyService.getQuery("findResResKonum", "rResKonum", value) ).get(0);
		deleteView();
		getSelectedAygitResimleri(resim.getAygit().getAygitid());
	}
	
	public boolean uploadControl() throws Exception{	
		System.out.println("Kontrol içindeyiz");
		int i = 0;
		try{
			for(i=0; i<fileList.size(); i++){ // Dosyanın kayıtlı olup olmadığı kontrol ediliyor
				System.out.println("directory : "+newFileDirectory);
				System.out.println("dest : "+dest);
				if(! ListFiles.checkFile(newFileDirectory+dest, CheckFileHash.fileCheck(fileList.get(i)))){    
					System.out.println("Dosya Mevcut hatası çıkar");
				}
			}			
			System.out.println("Kontrol tamam");			
			return true;
		}catch(MyException mye){
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Unsuccesful", fileList.get(i).getFileName() +" : "+ mye.getMessage());  
			FacesContext.getCurrentInstance().addMessage(null, msg);
			return false;
		}		
		catch(Exception e){
			System.out.println("uploadControl exp: "+e);
			//Burada kaydedilen fileList dosyalarını geri sil
			return false;
		}
	}
	
	public void cancelFileUpload(){ //Yükleme sırasında hata oluşurşa yüklenenler geri silinir.
		System.out.println("Cancel'ın içindeyiz");
		int i = 0;
		try{
			for(i=0; i<fileList.size(); i++){ // Dosyanın kayıtlı olup olmadığı kontrol ediliyor
						System.out.println("directory : "+newFileDirectory);
						System.out.println("dest : "+dest);
						if(ListFiles.checkFile4Cancel(newFileDirectory+dest, CheckFileHash.fileCheck(fileList.get(i) )) ){    
							//dosya kaydedildiyse buraya gelir
							DeleteFiles.deleteFiles("../"+dest+"/"+  //directory sonrası dosya yolu oluşturuldu.
								CheckFileHash.fileCheck( fileList.get(i) ) //MD5 alınır ve aşağıda dosya adına eklenir.
									+ UploadFiles.getFileExtension(fileList.get(i).getFileName()), newFileDirectory);
						}
					}
			System.out.println("Cancel tamam");	
		}catch(Exception e){
			System.out.println("cancelControl exp: "+e);
			//Burada kaydedilen fileList dosyalarını geri sil
			//return false;
		}
	}
	
	public void handleFileUpload(FileUploadEvent event) {  
    	System.out.println("upload");    	
    	System.out.println("dosya adı : "+event.getFile().getFileName());
    	fileList.add(event.getFile());	    	
    	FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Succesful", event.getFile().getFileName() + " is uploaded.");  
		FacesContext.getCurrentInstance().addMessage(null, msg);
    	/*try {
    		if(file != null){
    			upsfware = upsfware.saveFile(file,"yazilimlar");
    			if(upsfware.isIslem()){
    				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Succesful", file.getFileName() + " is uploaded.");  
    				FacesContext.getCurrentInstance().addMessage(null, msg);
    				//selectedAygitYzl.setDiskKonumu("../yazilimlar/"+upsfware.getFilePath());
    				SaveOrUpdate();
    			}
    			else{
    				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Unsuccesful", file.getFileName() + " isn't upload.");  
    				FacesContext.getCurrentInstance().addMessage(null, msg);
				}
			}else{
				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Succesful","Completed.");  
				FacesContext.getCurrentInstance().addMessage(null, msg);
				SaveOrUpdate();
			}
		}catch(MyException mye){
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Unsuccesful", file.getFileName() +" : "+ mye.getMessage());  
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
    	catch (Exception e) {
			System.out.println("handle Error");
			e.printStackTrace();
		} */
	}
	
	public void makeNullAll(){
		System.out.println("make null all");
		resimList.clear();
		selectedResim = new Resimler();
		resimList.clear();
		selectedAygitResimList.clear();
		
		fileList.clear();
		removeFile =null;
	}
	
	@Override
	public String createQuery() {
		return null;
	}

	@Override
	public void getSession() {
		// TODO Auto-generated method stub
		
	}

	public Resimler getSelectedResim() {
		return selectedResim;
	}

	public void setSelectedResim(Resimler selectedResim) {
		this.selectedResim = selectedResim;
	}

	public List<Resimler> getResimList() {
		return resimList;
	}

	public void setResimList(List<Resimler> resimList) {
		this.resimList = resimList;
	}

	public ArrayList<UploadedFile> getFileList() {
		return fileList;
	}

	public void setFileList(ArrayList<UploadedFile> fileList) {
		this.fileList = fileList;
	}

	public UploadedFile getRemoveFile() {
		return removeFile;
	}

	public void setRemoveFile(UploadedFile removeFile) {
		this.removeFile = removeFile;
	}

	public AygitBean getAgtBean() {
		return agtBean;
	}

	public void setAgtBean(AygitBean agtBean) {
		this.agtBean = agtBean;
	}

	public String getDest() {
		return dest;
	}

	public void setDest(String dest) {
		this.dest = dest;
	}

	public ArrayList<Resimler> getSelectedAygitResimList() {
		return selectedAygitResimList;
	}

	public void setSelectedAygitResimList(ArrayList<Resimler> selectedAygitResimList) {
		this.selectedAygitResimList = selectedAygitResimList;
	}
}